//
// SocketNotification.h
//
// Library: Net
// Package: Reactor
// Module:  SocketNotification
//
// Definition of the SocketNotification class.
//
// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
// and Contributors.
//
// SPDX-License-Identifier:	BSL-1.0
//


#ifndef Net_SocketNotification_INCLUDED
#define Net_SocketNotification_INCLUDED


#include "Poco/Net/Net.h"
#include "Poco/Net/Socket.h"
#include "Poco/Notification.h"


namespace Poco
{
namespace Net
{


    class SocketReactor;


    class Net_API SocketNotification : public Poco::Notification
    /// The base class for all notifications generated by
    /// the SocketReactor.
    {
    public:
        explicit SocketNotification(SocketReactor * pReactor);
        /// Creates the SocketNotification for the given SocketReactor.

        virtual ~SocketNotification();
        /// Destroys the SocketNotification.

        SocketReactor & source() const;
        /// Returns the SocketReactor that generated the notification.

        Socket socket() const;
        /// Returns the socket that caused the notification.

    private:
        void setSocket(const Socket & socket);

        SocketReactor * _pReactor;
        Socket _socket;

        friend class SocketNotifier;
    };


    class Net_API ReadableNotification : public SocketNotification
    /// This notification is sent if a socket has become readable.
    {
    public:
        ReadableNotification(SocketReactor * pReactor);
        /// Creates the ReadableNotification for the given SocketReactor.

        ~ReadableNotification();
        /// Destroys the ReadableNotification.
    };


    class Net_API WritableNotification : public SocketNotification
    /// This notification is sent if a socket has become writable.
    {
    public:
        WritableNotification(SocketReactor * pReactor);
        /// Creates the WritableNotification for the given SocketReactor.

        ~WritableNotification();
        /// Destroys the WritableNotification.
    };


    class Net_API ErrorNotification : public SocketNotification
    /// This notification is sent if a socket has signalled an error.
    {
    public:
        ErrorNotification(SocketReactor * pReactor);
        /// Creates the ErrorNotification for the given SocketReactor.

        ~ErrorNotification();
        /// Destroys the ErrorNotification.
    };


    class Net_API TimeoutNotification : public SocketNotification
    /// This notification is sent if no other event has occurred
    /// for a specified time.
    {
    public:
        TimeoutNotification(SocketReactor * pReactor);
        /// Creates the TimeoutNotification for the given SocketReactor.

        ~TimeoutNotification();
        /// Destroys the TimeoutNotification.
    };


    class Net_API IdleNotification : public SocketNotification
    /// This notification is sent when the SocketReactor does
    /// not have any sockets to react to.
    {
    public:
        IdleNotification(SocketReactor * pReactor);
        /// Creates the IdleNotification for the given SocketReactor.

        ~IdleNotification();
        /// Destroys the IdleNotification.
    };


    class Net_API ShutdownNotification : public SocketNotification
    /// This notification is sent when the SocketReactor is
    /// about to shut down.
    {
    public:
        ShutdownNotification(SocketReactor * pReactor);
        /// Creates the ShutdownNotification for the given SocketReactor.

        ~ShutdownNotification();
        /// Destroys the ShutdownNotification.
    };


    //
    // inlines
    //
    inline SocketReactor & SocketNotification::source() const
    {
        return *_pReactor;
    }


    inline Socket SocketNotification::socket() const
    {
        return _socket;
    }


}
} // namespace Poco::Net


#endif // Net_SocketNotification_INCLUDED
